const router = require("koa-router")();
const mongoose = require("mongoose");
// const jwt = require('jsonwebtoken');
// const Account = require('../../models/Account');
// const tkRecord = require('../../models/tkRecord');
// const tkLesson = require('../../models/tkLesson');
const base = require("../models/Fjxx");
const nstest = require("../models/NewStudent/newstudent");
const crypto = require("crypto-js");
const fs = require("fs");
const path = require("path");
const xls = require("xls-to-json");
const key = require("../cfg/key.js");
const pp = require("puppeteer-core");
const ExcelJS = require("exceljs");
const nss = require("../models/NewStudent/newstudentsign.js");
const findchrome = require("../node_modules/carlo/lib/find_chrome");
const nsn = require("../models/NewStudent/newstudentnotice.js");
const wechatconfig = require("../cfg/wechatconfig.js");
const wechatapi = require("../models/wechatapi/index.js");
const sitecfg = require("../cfg/siteconfig.js");
const aftclassrv_lesson = require("../models/AfterClassService/lesson.js");
const aftclassrv_application = require("../models/AfterClassService/application.js");

const moment = require("moment");
// const { cwd } = require("process");
// const multer=require('koa-multer');
const axios = require("axios");
const pdf = require("html-pdf-node");

router.prefix("/test");

router.get("/gethtmltopdf", async (ctx, next) => {
  let html = {
    url: "https://view.inews.qq.com/wxn/20200327A0A7E700?tbkt=A&strategy=&openid=o04IBAMlKu_iH87y6g8ipCPxfnjA&uid=&refer=wx_hot",
  };
  html={content:"<div><h1 style='text-align:center'>桂林市桂岭小学课后服务学生家长安全责任书</h1><p>尊敬的家长： </p><p>为建设平安校园，提高家长的安全意识，使家长们高度重视学生的安全工作，协同学校教育，保障学生的身体健康及各项安全，顺利在校内实施桂林市桂岭小学校内课后服务教学活动，特与学生、家长签订校内课后服务安全责任书：</p><p>一、家长应经常性地对学生加强安全教育，提高学生安全意识和防范能力。 </p><p>二、家长应了解并遵守学校制度，做到家校结合，齐抓共管。 </p><p>三、家长应对孩子进行如下安全教育和管理，学生应自觉遵守学校安全常规。</p><p>1． 教育孩子放学后应按时回家。离校后不准再进入学校玩耍。不在放学路上逗留，不与陌生人玩耍，径直回家。 </p><p>2． 教育孩子在校园内不得在教室内、走廊、楼梯、及楼梯转角处、校园转角处等场所打闹、跑跳或私自进行体育活动及游戏。上下楼梯有秩序、靠右行，不滑楼梯扶手，更不许翻越走廊栏杆，没有老师的保护下不许私自爬竿、玩单杠、双杠。走路过走廊，走路上下楼，走路到操场集队排归程队等。特别是在教学楼的转角处，不许追逐、调打，以免发生碰撞事故。 </p><p>3． 教育孩子之间要和睦相处，保持良好关系，不争吵打架，与同学玩耍时不要搞恶作剧，防止挫伤及其他损伤，不能随意推、挤、压、拉头、颈、腰、眼等人体重要部位，不许模仿电影电视中的动作或特技动作，以免发生意外事故。 </p><p>4． 教育孩子小心使用尺子、铅笔等尖锐物品，使用时不得对准同学，不得与同学相互调打，使用完毕后要尽快收藏好以避免刺伤他人。 </p><p>5． 教育孩子不能随意触摸学校电源插座，防止触电事故。 </p><p>6． 教育孩子身体不适时要尽早告诉老师，因生病或有事须请假时，应由家长电话联系或出示有家长签字的请假条；如临时需要离开学校时，学生本人应向老师说明缘由，由老师联系家长，得到家长证实或许可，获得老师批准后才能离开学校。 </p><p>7． 教育孩子校园外道路拥挤，人多车多，放学后要排归程队，按时回家，要遵守交通规则，走路要走人行道，过街要走斑马线、地下通道或天桥，不许在街上追逐打闹。 </p><p>8． 教育学生记住几个特殊电话号码，发生事故和发现安全隐患及时报告：</p><p>报警：110火警：119交通事故：122急救： 120</p><p>四、对家长的要求 </p><p>课后服务上课期间请家长配合学校的门卫管理制度，不得进入校园，如有特殊情况，请与班主任联系登记后方可进入校园。课后服务放学后家长在相应等待区接孩子，不允许进入校内， 学校将有组织地将学生排队送出校门。为避免学生无人监护发生意外。请家长按规定时间准时接孩子。 </p><p>各位家长有责任有义务做好孩子的安全教育工作，上述各条希望家长带领孩子认真学习并督促孩子遵照执行，本责任书有效期为一学年。</p><p>一、家长应经常性地对学生加强安全教育，提高学生安全意识和防范能力。 </p><p>二、家长应了解并遵守学校制度，做到家校结合，齐抓共管。 </p><p>三、家长应对孩子进行如下安全教育和管理，学生应自觉遵守学校安全常规。</p><p>1． 教育孩子放学后应按时回家。离校后不准再进入学校玩耍。不在放学路上逗留，不与陌生人玩耍，径直回家。 </p><p>2． 教育孩子在校园内不得在教室内、走廊、楼梯、及楼梯转角处、校园转角处等场所打闹、跑跳或私自进行体育活动及游戏。上下楼梯有秩序、靠右行，不滑楼梯扶手，更不许翻越走廊栏杆，没有老师的保护下不许私自爬竿、玩单杠、双杠。走路过走廊，走路上下楼，走路到操场集队排归程队等。特别是在教学楼的转角处，不许追逐、调打，以免发生碰撞事故。 </p><p>3． 教育孩子之间要和睦相处，保持良好关系，不争吵打架，与同学玩耍时不要搞恶作剧，防止挫伤及其他损伤，不能随意推、挤、压、拉头、颈、腰、眼等人体重要部位，不许模仿电影电视中的动作或特技动作，以免发生意外事故。 </p><p>4． 教育孩子小心使用尺子、铅笔等尖锐物品，使用时不得对准同学，不得与同学相互调打，使用完毕后要尽快收藏好以避免刺伤他人。 </p><p>5． 教育孩子不能随意触摸学校电源插座，防止触电事故。 </p><p>6． 教育孩子身体不适时要尽早告诉老师，因生病或有事须请假时，应由家长电话联系或出示有家长签字的请假条；如临时需要离开学校时，学生本人应向老师说明缘由，由老师联系家长，得到家长证实或许可，获得老师批准后才能离开学校。 </p><p>7． 教育孩子校园外道路拥挤，人多车多，放学后要排归程队，按时回家，要遵守交通规则，走路要走人行道，过街要走斑马线、地下通道或天桥，不许在街上追逐打闹。 </p><p>8． 教育学生记住几个特殊电话号码，发生事故和发现安全隐患及时报告：</p><p>报警：110火警：119交通事故：122急救： 120</p><p>四、对家长的要求 </p><p>课后服务上课期间请家长配合学校的门卫管理制度，不得进入校园，如有特殊情况，请与班主任联系登记后方可进入校园。课后服务放学后家长在相应等待区接孩子，不允许进入校内， 学校将有组织地将学生排队送出校门。为避免学生无人监护发生意外。请家长按规定时间准时接孩子。 </p><p>各位家长有责任有义务做好孩子的安全教育工作，上述各条希望家长带领孩子认真学习并督促孩子遵照执行，本责任书有效期为一学年。</p><p>谢谢您的配合！</p>    </div>"}
  pdf
    .generatePdf(html, {
      format: "A4",
      margin: { top: "2cm", right: "2cm", bottom: "2cm", left: "2cm" },
      path: "./public/abcd.pdf",
      displayHeaderFooter:true,
      headerTemplate:"<span class='title' style='display:none'>",
      footerTemplate:"<div style='width:100%;margin-left:100px;margin-right:100px'><p style='text-align:center;font-size:10px'>第 <span class='pageNumber'></span> 页 共<span class='totalPages'></span>页</p></div>"
    })
    .then((pdfBuffer) => {
      console.log("PDF Buffer:-", pdfBuffer);
      // fs.writeFile("./public/abc.pdf",pdfBuffer,err=>{
      //   if(err){console.log(err)}
      // })
    });
  ctx.body = "ok";
});

//测试get方式下autho的获取位置
router.get("/getmethod", async (ctx, next) => {
  console.log(ctx.header.authorization);
  ctx.body = "";
});
router.post("/getmethod", async (ctx, next) => {
  console.log(ctx.header.authorization);
  ctx.body = "";
});
router.get("/", async (ctx, next) => {
  //初始化无需要验证就可访问的路径
  let notcheckpath = [
    ["/wechatforsvr/getnews", "(GET)|(POST)", ""],
    ["/wechatforsvr/config", "(GET)|(POST)", ""],
    // ["/wechatforsvr/sendtemplatemsg", "(GET)|(POST)", ""],
    // ["/wechatforsvr/dakamsg", "(GET)|(POST)", ""],
    ["/wechatforsvr/newstu", "(GET)|(POST)", ""],
    ["/wechatforsvr/jsconfig/", "(GET)|(POST)", ""],
    ["/wechatforsvr/binder3", "(GET)|(POST)", ""],
    ["/wechatforsvr", "(GET)|(POST)", ""],
    ["/wechatforsvr/t", "(GET)|(POST)", ""],
    ["/sitenav/getlinks", "(GET)|(POST)", ""],
    ["/sys/login", "(GET)|(POST)", ""],
    ["/typekey/getalltklesson", "(GET)|(POST)", ""],
    ["/typekey/getlessonbyid", "(GET)|(POST)", ""],
    ["/typekey/gettkrecordrank", "(GET)|(POST)", ""],
    ["/login/getqr", "(GET)|(POST)", ""],
    ["/login/getwsc", "(GET)|(POST)", ""],
    ["/login", "(GET)|(POST)", ""],
    ["/sys/search", "(GET)|(POST)", ""],
    ["/sys/unbinderwechat", "(GET)|(POST)", ""],
    ["/transschool/gettransschoolinfo", "(GET)|(POST)", ""],
    ["/transschool/save", "(GET)|(POST)", ""],
    ["/sys/afterclasssvr/getstudentinfo", "(GET)|(POST)", ""],
    ["/sys/afterclasssvr/getallstudentofclass", "(GET)|(POST)", ""],
    ["/sys/importaccount", "(GET)|(POST)", ""],
    ["/wechatforsvr/delmenu", "(GET)|(POST)", ""],
    ["/wechatforsvr/creatmenu", "(GET)|(POST)", ""],
    ["/sys/account/getGradeAndClass", "(GET)|(POST)", ""],
    ["/sys/account/getStudentlistByClassNo", "(GET)|(POST)", ""],
    ["/sys/account/getStudentlistByGrade", "(GET)|(POST)", ""],
    ["/sys/account/getClassByGrade", "(GET)|(POST)", ""],
  ];
  notcheckpath.map((pp) =>
    ctx.state.enforcer.addPermissionForUser("exceptionsPath", ...pp)
  );
});
//循环日期
router.get("/loopdate", async (ctx, next) => {
  let start = new Date(ctx.query.start);
  let end = new Date(ctx.query.end);
  let start2 = start;
  let cc = moment(start2).isoWeekday() - 1;
  while (moment(end).diff(moment(start), "days") != 0) {
    let num = parseInt((moment(start).diff(moment(start2), "days") + cc) / 7);
    if (moment(start).isoWeekday() == 6 || moment(start).isoWeekday() == 7) {
      console.log(moment(start).format("YYYY-MM-DD") + "不上课,第" + num);
    } else {
      console.log(
        moment(start).format("YYYY-MM-DD") +
          "星期" +
          moment(start).isoWeekday() +
          "第" +
          num
      );
    }
    moment(start).add(1, "days");
    start = moment(start).add(1, "days");
  }
  ctx.body = "";
});
router.get("/getm", async (ctx, next) => {
  ctx.body = await wechatapi.getMaterial("news", 0, 20);
});

router.get("/menujumpurl", async (ctx, next) => {
  ctx.body =
    "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" +
    wechatconfig.wechatauth.appid +
    "&redirect_uri=" +
    encodeURIComponent("https://wechat.frp.mxthink.com.cn/api/wechatforsvr") +
    "&response_type=code&scope=snsapi_base&state=123#wechat_redirect";
});

router.get("/getdate", async (ctx, next) => {
  var odate = new Date();
  console.log(odate.toGMTString());
  console.log(odate.setTime(odate.getTime() + 6900 * 1000));
  ctx.body = odate.toGMTString();
});
router.get("/wechatenterconfig", async (ctx, next) => {
  //不管是访问下次路径还是什么其他路径 ，只要是该主域名下的路径都会导引到该函数内
  //加密解密配置
  //clientURL:前端页面访问根域名,生产模式下,前端页面以public路径存放前端。
  //serverURL:服务端数据提供端访问根域名，一般情况下clientURL与serverURL在生产模式下是一样的.只有在开发模式下才有可能设置成不一样的根域名
  //valiwechatcodePATH:指的是服务器端判断微信公众号用户授权获取openid及判断用户是否为绑定用户的逻辑处理路径。（一般不改变）
  //valitoken：指的是服务器端用来判断前端传来的token是否有效的逻辑处理路径 。（一般不改变）
  //binerokPATH:指的是用户绑定成功后或者是已绑定用户时要去的最终前端页面的路径（生产模式下，一般为public下的前端页面）

  let clientUrl = ctx.query.c;
  let serverUrl = ctx.query.s;
  let valiwechatcodePATH = ctx.query.vc;
  let valitoken = ctx.query.vt;
  let binderokPATH = ctx.query.bop;
  let wxdebug = Boolean(ctx.query.wxdbg);
  let sitedebug = Boolean(ctx.query.stdbg);

  var sitecfg = {
    clientURL: clientUrl || "http://mxthink.frp.luckylxh.top",
    serverURL: serverUrl || "http://mxthink.frp.luckylxh.top/api",
    valiwechatcodePATH: valiwechatcodePATH || "/wechatforsvr/binder",
    valitoken: valitoken || "/wechatforsvr/valitoken/",
    binderokPATH: binderokPATH || "/wechat/newstureg",
    wxdebug: wxdebug || false,
    sitedebug: sitedebug || false,
  };
  //加密
  let xx = crypto.AES.encrypt(JSON.stringify(sitecfg), "simple");
  //解密
  let debyte = crypto.AES.decrypt(xx, "simple");

  ctx.body = xx.toString() + "<===>" + debyte.toString(crypto.enc.Utf8);
});
router.get("/output", async (ctx, next) => {
  console.log(ctx.state.term)
  let casbin_e = ctx.state.enforcer;
  let casbin_result = await casbin_e.enforce(
    "管理员",
    "课后服务全校班级筛选",
    "fun"
  );
  let url = "当前是生产环境：";
  if (process.env.NODE_ENV) {
    url = "当前是开发环境：";
  }

  url +=
    "<br/>测试号学生登录地址：https://open.weixin.qq.com/connect/oauth2/authorize?appid=" +
    wechatconfig.wechatauth.appid +
    "&redirect_uri=" +
    encodeURIComponent("http://test.glsglxx.cn:8880/api/wechatforsvr") +
    "&response_type=code&scope=snsapi_base&state=123#wechat_redirect";
  url +=
    "<br/>测试号教师登录地址：https://open.weixin.qq.com/connect/oauth2/authorize?appid=" +
    wechatconfig.wechatauth.appid +
    "&redirect_uri=" +
    encodeURIComponent("http://test.glsglxx.cn:8880/api/wechatforsvr/t") +
    "&response_type=code&scope=snsapi_base&state=123#wechat_redirect";
  url +=
    "<br/>正式登录地址：https://open.weixin.qq.com/connect/oauth2/authorize?appid=" +
    wechatconfig.wechatauth.appid +
    "&redirect_uri=" +
    encodeURIComponent("https://wechat.frp.mxthink.com.cn/api/wechatforsvr") +
    "&response_type=code&scope=snsapi_base&state=123#wechat_redirect";
  url +=
    "<br/>正式教师登录地址：https://open.weixin.qq.com/connect/oauth2/authorize?appid=" +
    wechatconfig.wechatauth.appid +
    "&redirect_uri=" +
    encodeURIComponent("https://wechat.frp.mxthink.com.cn/api/wechatforsvr/t") +
    "&response_type=code&scope=snsapi_base&state=123#wechat_redirect";
  url +=
    "<br/>正式新生登录地址：https://open.weixin.qq.com/connect/oauth2/authorize?appid=" +
    wechatconfig.wechatauth.appid +
    "&redirect_uri=" +
    encodeURIComponent(
      "https://wechat.frp.mxthink.com.cn/api/wechatforsvr/newstu"
    ) +
    "&response_type=code&scope=snsapi_base&state=123#wechat_redirect";
  url +=
    "<br/>测试新生登录地址：https://open.weixin.qq.com/connect/oauth2/authorize?appid=" +
    wechatconfig.wechatauth.appid +
    "&redirect_uri=" +
    encodeURIComponent("http://test.glsglxx.cn:8880/api/wechatforsvr/newstu") +
    "&response_type=code&scope=snsapi_base&state=123#wechat_redirect";
  url += "测试功能认证结果:" + casbin_result;
  // ctx.body = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' + wechatconfig.wechatauth.appid + '&redirect_uri=' + encodeURIComponent("http://www.glsglxx.cn:8800/apitest/wechatforsvr") + '&response_type=code&scope=snsapi_base&state=123#wechat_redirect'
  // ctx.body='https://open.weixin.qq.com/connect/oauth2/authorize?appid=' + wechatconfig.wechatauth.appid + '&redirect_uri=' + encodeURIComponent("https://wechat.frp.mxthink.com.cn/api/wechatforsvr/newstu") + '&response_type=code&scope=snsapi_base&state=123#wechat_redirect';
  // ctx.body='https://open.weixin.qq.com/connect/oauth2/authorize?appid=' + wechatconfig.wechatauth.appid + '&redirect_uri=' + encodeURIComponent("https://wechat.frp.mxthink.com.cn/api/wechatforsvr") + '&response_type=code&scope=snsapi_base&state=123#wechat_redirect';
  // ctx.body='https://open.weixin.qq.com/connect/oauth2/authorize?appid=' + wechatconfig.wechatauth.appid + '&redirect_uri=' + encodeURIComponent("http://school.mxthink.com.cn:8800/") + '&response_type=code&scope=snsapi_base&state=123#wechat_redirect';
  ctx.type = "html";
  ctx.body = url;
});
router.get("/2019ns", async (ctx, next) => {
  let all = await nstest.findall();

  all.forEach(async (doc) => {
    await nstest.updateone(
      {
        身份证: doc.身份证,
      },
      {
        $set: {
          password: doc.身份证.substr(12, 6),
          wxopenid: null,
        },
      }
    );
  });
  // let rs=await nstest.update({'身份证':'450303201210150526'},{$set:{password:'aabbcc',wxopenid:null}})

  //console.log(rs)
  ctx.body = "";
});

router.get("/xls2json", async (ctx, next) => {
  // let exec=new Promise(xls2json);
  // await exec.then((result)=>{
  //     ctx.body=result;
  // })
  // .catch((err)=>{
  //     ctx.body=err;
  // })
  try {
    let data = await xls2json2(
      "../public/upload/2020-08-17复审合格导出.xlsx",
      "桂林小学报名数据"
    );
    ctx.body = data;
  } catch (err) {
    ctx.body = err.message;
  }
});
router.post("/testpost", async (ctx, next) => {
  ctx.body = "<h1>afsdfasdfd</h1>";
});
router.post("/getnotice", async (ctx, next) => {
  let wxopenid = ctx.request.body.wxopenid;
  try {
    let notice = await nsn.findOneByQuery({
      openid: wxopenid,
    });
    ctx.body = {
      error: false,
      result: notice,
    };
  } catch (err) {
    ctx.body = {
      error: true,
      message: err.message,
    };
  }
});

router.post("/noticereaded", async (ctx, next) => {
  let wxopenid = ctx.request.body.wxopenid;
  try {
    let notice = await nsn.updateone(
      {
        openid: wxopenid,
      },
      {
        $set: {
          readed: 1,
        },
      }
    );
    ctx.body = {
      error: false,
      result: notice,
    };
  } catch (err) {
    ctx.body = {
      error: true,
      message: err.message,
    };
  }
});

router.get("/webpagetopdf", async (ctx, next) => {
  let findc = await findchrome({});
  let cpath = findc.executablePath;
  const browser = await pp.launch({
    executablePath: cpath,
  });
  const page = await browser.newPage();
  await page.goto("http://mxthink.cross.echosite.cn/xmng/graduatetable", {
    waitUntil: "networkidle0",
  });
  //生成PDF
  // const res=await page.pdf({
  //     //path: 'baidu.pdf',
  //     printBackground:true,
  // })
  // ctx.set('Content-Disposition','attachment;filename="test.pdf"')
  // ctx.set('Content-Type', 'application/octet-stream;charset=utf-8')

  const res = await page.screenshot();
  // (
  //     {
  //     // printBackground:true,
  // //    path:"test.jpg",
  //     type:"jpeg"
  // }
  // )
  ctx.set("Content-Disposition", 'attachment;filename="test.png"');
  ctx.set("Content-Type", "application/octet-stream;charset=utf-8");

  browser.close();
  // ctx.type="image/png"
  ctx.body = res;
});

router.get("/cfgtostring", async (ctx, next) => {
  let str = "http://mxthink2.cross.echosite.cn";
  let psw = "xmilyhh";

  //加密
  let cipher = crypto.createCipher("aes-192-ccm", psw);
  let crypted = cipher.update(str, "utf-8", "hex");
  crypted += cipher.final("hex");

  //解密
  let decipher = crypto.createDecipher("aes-192-ccm", psw);
  let decrypted = decipher.update(crypted, "hex", "utf-8");
  decrypted += decipher.final("utf-8");

  ctx.body = "加密:" + crypted + "<br>解密:" + decrypted;

  //没成功
  //ctx.body=crypted
});

router.get("/datatoexcel2", async (ctx, next) => {
  // let ws=fs.createWriteStream('./wb.xlsx')
  // var workbook=new ExcelJS.stream.xlsx.WorkbookWriter({
  //filename:'./wb.xlsx'
  // stream:ws
  // });
  var workbook = new ExcelJS.stream.xlsx.WorkbookWriter();
  var worksheet = workbook.addWorksheet("Sheet");
  worksheet.columns = [
    {
      header: "id",
      key: "id",
    },
    {
      header: "name",
      key: "name",
    },
    {
      header: "phone",
      key: "phone",
    },
  ];
  var data = [
    {
      id: 100,
      name: "abc",
      phone: "1231123123",
    },
  ];
  for (let i in data) {
    worksheet.addRow(data[i]).commit();
  }
  await workbook.commit();
  ctx.body = workbook;
});

router.get("/aftclasTypeCount", async (ctx, next) => {
  let term = sitecfg.term;
  let month = "3";
  let schoolname = sitecfg.schoolname;
  let resarr = [];
  let matcharr = [
    {
      match: {
        term: term,
        month: month,
        $and: [{ status: { $ne: "申请退出" } }, { status: { $ne: "退出" } }], //参加课后服务的总人数
      },
      typename: "总人数",
      id: 1,
    },
    {
      match: {
        term: term,
        month: month,
        $and: [{ status: { $ne: "申请退出" } }, { status: { $ne: "退出" } }], //参加课后服务的总人数
        baselesson: true,
      },
      typename: "基础课",
      id: 2,
    },
    {
      match: {
        term: term,
        month: month,
        $and: [{ status: "申请退出" }], //申请退出的人数
      },
      typename: "申请退出",
      id: 4,
    },
    {
      match: {
        term: term,
        month: month,
        $and: [{ status: "退出" }], //退出的人数
      },
      typename: "退出",
      id: 4,
    },
    {
      match: {
        term: term,
        month: month,
        $and: [{ status: "未分配" }], //未分配的人数
      },
      typename: "未分配",
      id: 4,
    },
    {
      match: {
        term: term,
        month: month,
        $and: [{ status: "再入申请" }], //再入申请的人数
      },
      typename: "再入申请",
      id: 4,
    },
  ];
  try {
    let interestlesson = await aftclassrv_lesson.GetByQuery(
      {
        schoolname: sitecfg.schoolname,
        term: sitecfg.term,
      },
      { lessonname: 1, _id: 0, limit: 1, teacher: 1 }
    );
    interestlesson.forEach((element) => {
      matcharr.push({
        match: {
          term: term,
          month: month,
          $and: [{ status: "已分配" }],
          selected: element.lessonname,
        },
        typename: element.lessonname,
        id: 3,
      });
    });

    //取得班级列表
    let query = [
      {
        $match: {
          term: sitecfg.term,
        },
      },
      {
        $group: {
          _id: "$classno",
        },
      },
      {
        $sort: {
          _id: -1,
        },
      },
    ];
    let classno = await aftclassrv_application.myAggregate(query);
    console.log(classno);

    let resarr = [];
    let promiseArr = matcharr.map(async (doc) => {
      let res2 = await aftclassrv_application.myAggregate([
        {
          $match: doc.match,
        },
        {
          $project: {
            applicationwrite: 0,
            safewrite: 0,
          },
        },
        {
          $group: {
            _id: "$classno",
            count: { $sum: 1 },
          },
        },
        {
          $sort: {
            _id: 1,
          },
        },
      ]);
      resarr.push({ typename: doc.typename, data: res2, id: doc.id });
    });
    await Promise.all(promiseArr);
    // console.log(resarr);
    ctx.body = { error: false, result: cv(resarr, classno) };
  } catch (err) {
    throw new Error("获取课后服务社团课程时出错:[" + err + "]");
  }
});

//转换各类统计
function cv(arr, classno) {
  let newarr = [];
  classno.forEach((doc) => {
    newarr.push({ classno: doc._id });
  });
  arr.forEach((a) => {
    a.data.forEach((d) => {
      let index = newarr.findIndex((c) => c.classno == d._id);
      let typename = a.typename;
      newarr[index][a.typename] = d.count;
    });
  });
  return newarr;
}
router.get("/datatoexcel", async (ctx, next) => {
  //let data=await nss.findbyquery({});
  //ctx.body=data
  //let p = path.join(__dirname, '../public/upload/报名数据.xlsx');
  let data = await xls2json2(
    "../public/upload/20200720报名数据导出.xlsx",
    "桂林小学报名数据"
  );
  let wb = new ExcelJS.stream.xlsx.WorkbookWriter({
    filename: "./wb.xlsx",
  });
  let st = wb.addWorksheet("房产查询");
  let st2 = wb.addWorksheet("居住证查询");
  st.columns = [
    {
      header: "姓名",
      key: "name",
    },
    {
      header: "身份证号",
      key: "pid",
    },
  ];
  st2.columns = [
    {
      header: "姓名",
      key: "name",
    },
    {
      header: "性别",
      key: "gender",
    },
    {
      header: "居住证持有人",
      key: "name2",
    },
    {
      header: "持有人身份证号",
      key: "pid",
    },
    {
      header: "联系电话",
      key: "tel",
    },
  ];
  let count = data.length;
  let k = 0;
  for (let o in data) {
    if (data[o].学生类型 == "A户籍生") {
      st.addRow({
        name: data[o].学生姓名,
        pid: data[o].学生身份证号,
      }).commit();
      st.addRow({
        name: data[o].成员1姓名,
        pid: data[o].成员1身份证件号,
      }).commit();
      st.addRow({
        name: data[o].成员2姓名,
        pid: data[o].成员2身份证件号,
      }).commit();
    } else {
      let name2 = data[o].产权房证持有人居住证持有人.trim();
      let tel = "";
      if (name2 == data[o].成员1姓名.trim()) {
        tel = data[o].成员1联系电话;
      } else {
        tel = data[o].成员2联系电话;
      }
      st2
        .addRow({
          name: data[o].学生姓名,
          gender: data[o].性别,
          name2: data[o].产权房证持有人居住证持有人,
          pid: data[o].持有人身份证件号,
          tel: tel,
        })
        .commit();
    }
    k++;
    console.log(k + "/" + count);
  }

  wb.commit();
  ctx.body = "ok";
});

function xls2json2(filepath, sheet) {
  return new Promise((resolve, reject) => {
    let p = path.join(__dirname, filepath);
    console.log("path:" + p);
    xls(
      {
        input: p,
        output: null,
        sheet: sheet,
      },
      function (err, result) {
        if (err) {
          console.error(err);
          reject(err);
        } else {
          console.log(result);
          resolve(result);
        }
      }
    );
  });
}
//https://www.jianshu.com/p/8aa148435499
function xls2json(resolve, reject) {
  let p = path.join(__dirname, "../public/upload/signtemplate.xlsx");
  console.log("path:" + p);
  xls(
    {
      input: p,
      output: null,
      sheet: "Sheet1",
    },
    function (err, result) {
      if (err) {
        console.error(err);
        reject(err);
      } else {
        console.log(result);
        resolve(result);
      }
    }
  );
}

module.exports = router;
